/*
 * dbfileQue.c
 *
 *  Created on: 2014-9-16
 *      Author: wbb
 */
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include "dbfileQue.h"

#ifdef UC_MS02

static SDBfileFileList  m_dbfilefileList; //抓拍队列缓冲区
static int m_dbfilebInit = 0;//初始化标志
static int	m_dbfileHead;		//队列头
static int	m_dbfileTail;		//队列尾
static int	m_dbfileFreeSize;	//剩余可用空间大小
pthread_mutex_t m_dbfileMutex;

//功能描述:抓拍队列初始化
//返回值：
//	=0:成功
//	－１: 失败
int dbfilequeue_init()
{
	if(m_dbfilebInit == 1)
		return 0;

	m_dbfilefileList.iNum = DBFILEELEMNET_NUM;
	m_dbfileFreeSize = DBFILEELEMNET_NUM-1;
	m_dbfileHead = 0;
	m_dbfileTail = 0;
	m_dbfilebInit = 1;
	pthread_mutex_init(&m_dbfileMutex, NULL);
	printf("##########################dbfilequeue_init success\n");
	return 0;
}
//功能描述:抓拍队列资源释放
//返回值：
//	=0:成功
//	－１: 失败
int dbfilequeue_free()
{
	if(m_dbfilebInit == 0)
		return -1;
	
	m_dbfilefileList.iNum = 0;
	m_dbfileHead = 0;
	m_dbfileTail = 0;
	m_dbfilebInit = 0;

	pthread_mutex_destroy(&m_dbfileMutex);
	printf("##########################dbfilequeue_free success\n");
	return 0;
}

//返回队列可用长度
int dbfilequeue_GetFreeSize()
{
	return m_dbfileFreeSize;
}
//功能描述:将元素放入到队列中
//参数：
//nIndex:元素标示
//返回值：
//	=0:成功
//	－１: 失败
int dbfilequeue_PutData(SDBfileFileInfo *fileInfo)
{
	pthread_mutex_lock(&m_dbfileMutex);
	if(m_dbfilebInit == 0)
	{
		pthread_mutex_unlock(&m_dbfileMutex);
		printf("dbfilequeue_PutData failed:init error\n");
		return -1;
	}
	if((m_dbfileFreeSize<1) ||(fileInfo==NULL))
	{
		pthread_mutex_unlock(&m_dbfileMutex);
		printf("dbfilequeue_PutData failed:queue full\n");
		return -1;
	}
	
	//拷贝数据
	m_dbfilefileList.fileInfo[m_dbfileTail] = *fileInfo;

	//队尾添加数据，一直指向最后一个可用空间
	m_dbfileTail++;
	m_dbfileTail %= m_dbfilefileList.iNum;
	--m_dbfileFreeSize;

	pthread_mutex_unlock(&m_dbfileMutex);
	return 0;
}
//功能描述:获取数据
//参数：
//allocBufInfo:有时间戳值   输出时把数据存储到结构中
//返回值：
//	=0:成功
//	－１: 失败
int dbfilequeue_GetData(SDBfileFileInfo *fileInfo)
{
	pthread_mutex_lock(&m_dbfileMutex);
	if(m_dbfilebInit == 0)
	{
		//printf("dbfile get data fail queue is not init\n");
		pthread_mutex_unlock(&m_dbfileMutex);
		return -1;
	}
	//m_queNum - 1，保留1个空间，如果==m_queNUm-1，说明没有数据
	if(m_dbfileFreeSize >= m_dbfilefileList.iNum - 1)
	{
		pthread_mutex_unlock(&m_dbfileMutex);
		printf("dbfile get data failed queue is empty\n");
		return -1;
	}

	//拷贝数据
	*fileInfo = m_dbfilefileList.fileInfo[m_dbfileHead];

	m_dbfileHead++;
	m_dbfileHead %= m_dbfilefileList.iNum;
	++m_dbfileFreeSize;

	pthread_mutex_unlock(&m_dbfileMutex);
	return 0;
}

#endif // UC_MS02
